package com.yty.newconsult.service;

import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.volcengine.ark.runtime.model.completion.chat.ChatCompletionRequest;
import com.volcengine.ark.runtime.model.completion.chat.ChatMessage;
import com.volcengine.ark.runtime.model.completion.chat.ChatMessageRole;
import com.volcengine.ark.runtime.service.ArkService;

import com.yty.newconsult.utils.RedisUtils;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Slf4j
@Service

public class InvokeApiService {
    private final String apiKey="6ec64b7f-ebd4-457f-89e6-b16743e33af0";
    private final String ts_key="487b4d5950ca01579e9127d289d45140";

    @Resource
    private RedisUtils redisUtils;

    public String getDailyNews(){
        String url = "https://api.tanshuapi.com/api/toutiao/v1/index";
        Map<String,Object> params=new HashMap<>();
        params.put("num",40);
        params.put("start",0);
        params.put("key",ts_key);
        return HttpUtil.get(url, params);
    }
    public  ResponseEntity<?> getDailyNews(int num,int start){
        String url = "https://api.tanshuapi.com/api/toutiao/v1/index";
        Map<String,Object> params=new HashMap<>();
        params.put("num",num);
        params.put("start",start);
        params.put("key",ts_key);
        try {
            String response = HttpUtil.get(url, params);
            return ResponseEntity.ok(response);// 发请求
             // 返回原始 JSON 字符串
        } catch (Exception e) {
            return ResponseEntity.status(HttpStatus.BAD_GATEWAY).body("请求新闻失败：" + e.getMessage());
        }
    }
    public String queryContent(String query,String searchType){
        try {
            JSONObject requestBody = new JSONObject();
            requestBody.put("query", query);  // 必须有 query 字段！
            requestBody.put("top_k", 10);
            requestBody.put("search_type", searchType);
            // 发送 POST 请求
            String res = HttpUtil.createPost("http://localhost:8000/query")  // 确保 URL 正确
                    .header("Content-Type", "application/json")  // 设置 JSON 请求头
                    .body(requestBody.toString())  // 发送 JSON
                    .execute()
                    .body();

            System.out.println("Response: " + res);
            return res;
        } catch (Exception e) {
            log.error("调用queryContent接口失败",e);
            return null;
        }
    }
    public String querySummary(String id,String text){
        redisUtils.set(id,text);
        JSONObject requestBody=new JSONObject();
        requestBody.put("model","deepseek-r1-250120");
        JSONArray messages=new JSONArray();
        JSONObject msg1=new JSONObject();
        JSONObject msg2=new JSONObject();
        msg1.put("role","system");
        msg1.put("content","用户将提供给你一段新闻内容，请你分析新闻内容，并提取其中的关键信息，" +
                "以 JSON 的形式输出，输出的 JSON 需遵守以下的格式：\n\n{\n  \"entiry\": <新闻实体>,\n  \"time\": " +
                "<新闻时间，格式为 YYYY-mm-dd HH:MM:SS，没有请填 null>,\n  \"summary\": <新闻内容总结>\n}");
        msg2.put("role","user");
        msg2.put("content",text);
        messages.add(msg1);
        messages.add(msg2);
        requestBody.put("messages",messages);
        String res= HttpUtil.createPost("https://ark.cn-beijing.volces.com/api/v3/chat/completions")
                .header("Authorization","Bearer "+apiKey)//设置请求头
                .header("Content-Type","application/json")
                .body(requestBody.toString())
                .execute().body();//发送请求并生成响应体
        System.out.println("返回值"+res);
        JSONObject obj= JSONUtil.parseObj(res);
        JSONArray choices=obj.getJSONArray("choices");
        JSONObject choice=choices.getJSONObject(0);
        JSONObject message=choice.getJSONObject("message");
        String data=message.getStr("content");
        String new_data=data.replace("```json\n", "")
                .replace("\n```", "");
        JSONObject clean_message=JSONUtil.parseObj(new_data);
        System.out.println(clean_message);
        return clean_message.getStr("summary");
    }
    public String queryDs(String question,String id){
        String text=String.valueOf(redisUtils.get(id));
        JSONObject requestBody=new JSONObject();
        requestBody.put("model","deepseek-r1-250120");
        JSONArray messages=new JSONArray();
        JSONObject msg1=new JSONObject();
        JSONObject msg2=new JSONObject();
        msg1.put("role","system");
        msg1.put("content","用户将提供给你一段新闻内容，请你根据新闻内容回答问题");
        msg2.put("role","user");
        msg2.put("content",text+"\n"+question);
        messages.add(msg1);
        messages.add(msg2);
        requestBody.put("messages",messages);
        String res= HttpUtil.createPost("https://ark.cn-beijing.volces.com/api/v3/chat/completions")
                .header("Authorization","Bearer "+apiKey)//设置请求头
                .header("Content-Type","application/json")
                .body(requestBody.toString())
                .execute().body();
        JSONObject obj= JSONUtil.parseObj(res);
        JSONArray choices=obj.getJSONArray("choices");
        JSONObject choice=choices.getJSONObject(0);
        JSONObject message=choice.getJSONObject("message");
        return message.getStr("content");
    }
    public void querySummarySdk(String id,String text, ChannelHandlerContext ctx){
        redisUtils.set(id,text);
        ArkService arkService = ArkService.builder().apiKey(apiKey)
                .build();
        // 初始化消息列表
        List<ChatMessage> chatMessages = new ArrayList<>();
        chatMessages.add(ChatMessage.builder()
                .role(ChatMessageRole.SYSTEM) // 设置消息角色为系统
                //                        "以 JSON 的形式输出，输出的 JSON 需遵守以下的格式：\n\n{\n  \"entiry\": <新闻实体>,\n  \"time\": " +
//                        "<新闻时间，格式为 YYYY-mm-dd HH:MM:SS，没有请填 null>,\n  \"summary\": <新闻内容总结>\n}") // 设置消息内容
                .content("用户将提供给你一段新闻内容，请你分析新闻内容，并提取其中的关键信息生成摘要，" +
                        " 输出的格式为：摘要:<新闻内容总结>")
                .build());

        // 将用户消息添加到消息列表
        chatMessages.add(ChatMessage.builder()
                .role(ChatMessageRole.USER) // 设置消息角色为用户
                .content(text) // 设置消息内容
                .build());
        // 创建聊天完成请求
        ChatCompletionRequest chatCompletionRequest = ChatCompletionRequest.builder()
                .model("deepseek-v3-250324")// 需要替换为模型的ModelID   推理模型:deepseek-r1-250120
                .messages(chatMessages) // 设置消息列表
                .build();
        // 发送聊天完成请求并打印响应
        arkService.streamChatCompletion(chatCompletionRequest)
                .doOnError(Throwable::printStackTrace) // 捕获错误
                .doOnTerminate(() -> {
                    System.out.println("流结束，关闭资源");
                    arkService.shutdownExecutor(); // 不管成功失败都会调用
                })
                .subscribe(choice -> {
                    if (choice.getChoices().size() > 0) {
                        ChatMessage message = choice.getChoices().get(0).getMessage();
                        if (message.getReasoningContent() != null && !message.getReasoningContent().isEmpty()) {
                            ctx.writeAndFlush(new TextWebSocketFrame(message.getReasoningContent()));
                        }
                        ctx.writeAndFlush(new TextWebSocketFrame(message.getContent().toString()));
                    }
                });
    }
    public void queryDsSdk(String question, String id, ChannelHandlerContext ctx){
        String text=String.valueOf(redisUtils.get(id));
        ArkService arkService = ArkService.builder().apiKey(apiKey)
                .build();
        // 初始化消息列表
        List<ChatMessage> chatMessages = new ArrayList<>();
        chatMessages.add(ChatMessage.builder()
                .role(ChatMessageRole.SYSTEM) // 设置消息角色为系统
                .content("用户将提供给你一段新闻内容，请你根据新闻内容回答问题") // 设置消息内容
                .build());

        // 将用户消息添加到消息列表
        chatMessages.add(ChatMessage.builder()
                .role(ChatMessageRole.USER) // 设置消息角色为用户
                .content(text+"\n"+question) // 设置消息内容
                .build());
        // 创建聊天完成请求
        ChatCompletionRequest chatCompletionRequest = ChatCompletionRequest.builder()
                .model("deepseek-v3-250324")// 需要替换为模型的ModelID   推理模型:deepseek-r1-250120
                .messages(chatMessages) // 设置消息列表
                .build();
        // 发送聊天完成请求并打印响应
        try {
            // 获取响应并打印每个选择的消息内容
            arkService.streamChatCompletion(chatCompletionRequest)
                    .doOnError(Throwable::printStackTrace)
                    .blockingForEach(choice -> {
                        if (choice.getChoices().size() > 0) {
                            ChatMessage message = choice.getChoices().get(0).getMessage();
                            // 判断是否触发深度思考，触发则打印模型输出的思维链内容
                            if (message.getReasoningContent()!= null &&!message.getReasoningContent().isEmpty()) {
                                ctx.writeAndFlush(new TextWebSocketFrame(message.getReasoningContent()));
                            }

                            //传给客户端
                            ctx.writeAndFlush(new TextWebSocketFrame(message.getContent().toString()));
                        }
                    });
        } catch (Exception e) {
            System.out.println("请求失败: " + e.getMessage());
        } finally {
            // 关闭服务执行器
            arkService.shutdownExecutor();
        }
    }
}
